package com.bit.cfdi.web.dao.impl;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.bit.cfdi.web.dao.EtiquetaDAO;
import com.bit.cfdi.web.domain.Etiqueta;
import com.bit.cfdi.web.domain.Giro;
import com.bit.cfdi.web.domain.Negocio;

@Repository
public class EtiquetaDAOImpl extends HibernateDaoSupport implements EtiquetaDAO  {

	@Autowired
	public void init(final SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	@Transactional public List<Etiqueta> getAll() throws DataAccessException {
		List<Etiqueta> etiquetas = getHibernateTemplate().find(
				" from Etiqueta as etiqueta");				
		return etiquetas;
	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional public List<Etiqueta> getAllDefault() throws DataAccessException {
		List<Etiqueta> etiquetas = getHibernateTemplate().find(
				" from Etiqueta as etiqueta" +
				" where etiqueta.negocio = null" +
				" and etiqueta.status = null");		
		return etiquetas;
	}

	@Override
	@Transactional public void save(Etiqueta etiqueta) throws DataAccessException {
		getHibernateTemplate().saveOrUpdate(etiqueta);
	}

	@SuppressWarnings("unchecked")
	@Transactional public List<Etiqueta> getByNegocio(
			Negocio negocio) throws DataAccessException {
		List<Etiqueta> etiquetas= getHibernateTemplate().find(
				" from Etiqueta as etiqueta " +
				" where etiqueta.negocio = ?",negocio);
		return etiquetas;
	}
	
	@SuppressWarnings("unchecked")
	@Transactional public List<Etiqueta> getByDscr(
			String dscr,Negocio negocio) throws DataAccessException {
		if(dscr==null)	{
			dscr="";
		}
		List<Etiqueta> etiquetas= getHibernateTemplate().find(
				" from Etiqueta as etiqueta " +
				" where  (etiqueta.negocio = null or etiqueta.negocio = ?)"
				+" AND LOWER(etiqueta.etiqueta) = ?",negocio,dscr.toLowerCase());
		return etiquetas;
	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional public List<Etiqueta> getByStatusAndNegocio(
			Integer status, Negocio negocio) throws DataAccessException {
		List<Etiqueta> etiqueta = getHibernateTemplate().find(
				" from Etiqueta as etiqueta " +
				" where etiqueta.status = ? and (etiqueta.negocio = null or etiqueta.negocio = ?)",status, negocio);
		return etiqueta;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	@Transactional public List<Etiqueta> getByStatusDefaultAndNegocio(
			Integer status, Negocio negocio) throws DataAccessException {
		List<Etiqueta> etiqueta = getHibernateTemplate().find(
				" from Etiqueta as etiqueta " +
				" where (etiqueta.status = ? or etiqueta.status = null)and (etiqueta.negocio = null or " +
				"etiqueta.negocio = ?)",status, negocio);
		return etiqueta;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	@Transactional public List<Etiqueta> getAllDefaultInit()  throws DataAccessException {
		List<Etiqueta> etiquetas = getHibernateTemplate().find(
				" from Etiqueta as etiqueta" +
				" where etiqueta.negocio = null" + 
				" and etiqueta.status = null" );		
		return etiquetas;
	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional public List<Etiqueta> getByGiro(
			Giro giro) throws DataAccessException {
		List<Etiqueta> etiqueta = null;
		etiqueta = getHibernateTemplate().find(
				"SELECT etiqueta " +
				"FROM Etiqueta as etiqueta," +				
				"GiroEtiqueta giroEtiqueta " +
				"WHERE giroEtiqueta.giro.idGiro = ? " +
				"AND etiqueta.idEtiqueta = " +
				"giroEtiqueta.etiqueta.idEtiqueta", giro.getIdGiro());
		return etiqueta;
	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional public Etiqueta getByIdentificador(
			String identificador) throws DataAccessException {
		List<Etiqueta> etiquetas = getHibernateTemplate().find(
				" from Etiqueta as etiqueta" +
				" where etiqueta.identificador = ?", identificador);		
		return etiquetas.size()>0?etiquetas.get(0):null;
	}
	
	
	@SuppressWarnings("unchecked")
	@Override
	@Transactional public List<Etiqueta> getByIdentificador(
			String identificador,Negocio negocio) throws DataAccessException {
		if(identificador==null) {
			identificador="";
		}
		List<Etiqueta> etiquetas= getHibernateTemplate().find(
				" from Etiqueta as etiqueta " +
				" where  (etiqueta.negocio = null or etiqueta.negocio = ?)"
				+" AND LOWER(etiqueta.identificador) = ?",negocio,identificador.toLowerCase());
		return etiquetas;
	}

}
